import asyncio
import os

import semantic_kernel as sk
from dotenv import load_dotenv, find_dotenv
from semantic_kernel.connectors.ai.open_ai.services.open_ai_chat_completion import OpenAIChatCompletion
from semantic_kernel.functions import KernelArguments

'''
我们可以将 semantic function 与源代码分离存储。这样更易于维护与复用。
一个典型的 semantic function 包含两个文件：
    - skprompt.txt: 存放 prompt，可以包含参数，还可以调用其它函数
    - config.json: 存放配置，包括函数功能，参数的数据类型，以及调用大模型时的参数
举例：根据用户的自然语言指示，生成 SQL 查询
上面两个文件都在 demo/MyPlugins/Text2SQL/ 目录下。
'''
_ = load_dotenv(find_dotenv())
# 创建 semantic kernel
kernel = sk.Kernel()
api_key = os.getenv("OPENAI_API_KEY")
serviceId = "default"
# 将 LLM 服务添加到 kernel 中
kernel.add_service(
    OpenAIChatCompletion(
        service_id=serviceId,
        ai_model_id="gpt-3.5-turbo-1106",
        api_key=api_key
    ),
)
# 加载 semantic function。注意目录结构
# myPlugins代表加载当前目录demo下面的MyPlugins目录下的插件
myPlugins = kernel.add_plugin(parent_directory="./demo", plugin_name="MyPlugins")
# 从插件目录中获取一个插件,Text2SQL也是一个目录
funcPlugin = myPlugins["Text2SQL"]


async def runAsyncFunc(*args):
    return await kernel.invoke(*args)


# input 是skpromt.txt中要求输入的参数

result = asyncio.run(
    runAsyncFunc(
        funcPlugin,
        KernelArguments(input="2024年4月有哪些课"),
    )
)
print(result)
